﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ATEC.ATDataCoreNET.ATObjects;
using ATEC.ATDataCoreNET;
using ATEC.ATDataCoreNET.CCF;
using ATEC.GeometryNET;
using ATEC.ATCore;

/// <summary>
/// 文件名：ParameterizedObject.cs
/// 分类：玄镜BIM图形平台/C#开发/示例代码/参数化对象
/// 
/// 功能概述：
/// 展示如何创建和管理参数化的圆台对象，包括几何创建、属性控制和图形显示等功能。
/// 
/// 对象功能：
/// 1. 几何控制：
///    - 顶部半径控制
///    - 底部半径控制
///    - 高度控制
///    - 中心点位置控制
/// 
/// 2. 图形显示：
///    - 实体显示样式
///    - 辅助线样式
///    - 文字标注样式
///    - 夹点控制
/// 
/// 关键类和工具：
/// 1. 基础类：
///    - ATGraphicObject：图形对象基类
///    - CircularTable：圆台几何实现类
///    - ATViewContxt：视图上下文类
/// 
/// 2. 几何类：
///    - SolidCoreEntity：实体核心类
///    - XPoint3d：三维点类
///    - XVector3d：三维向量类
/// 
/// 使用场景：
/// 1. 参数化建模示例
/// 2. 自定义图形对象开发
/// 3. 交互式图形编辑
/// 
/// 注意事项：
/// 1. CCF属性配置需要正确
/// 2. 几何参数需要有效性检查
/// 3. 视图样式需要正确设置
/// 4. 夹点操作需要同步更新
/// </summary>
namespace ParameterizedObjectExample
{
    /// <summary>
    /// 类名：ParameterizedObject
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/参数化对象
    /// 
    /// 功能：实现参数化的圆台对象，支持动态编辑和显示
    /// 继承：ATGraphicObject
    /// 
    /// 关键类：
    /// - ATGraphicObject：基础图形对象类，提供图形显示和交互功能
    /// - CircularTable：圆台几何实现类，提供实体创建功能
    /// - ATViewContxt：视图上下文类，控制显示样式
    /// 
    /// CCF配置：
    /// - ccfName: CustomObjectExample
    /// - cclanName: CircularTable
    /// 
    /// 属性说明：
    /// - btmRadius：底部半径
    /// - topRadius：顶部半径
    /// - height：高度
    /// - ptCenter：中心点位置
    /// </summary>
    [CCF(ccfName = "CustomObjectExample", cclanName = "CircularTable")]
    public class ParameterizedObject : ATGraphicObject
    {
        /// <summary>
        /// 构造函数
        /// 功能：初始化参数化圆台对象
        /// 
        /// 参数：
        /// - scene：场景引用，用于对象管理
        /// 
        /// 关键类：
        /// - ATSceneRef：场景引用类，管理对象与场景的关联
        /// 
        /// 注意事项：
        /// 1. 确保场景引用有效
        /// 2. 初始化必要的属性
        /// </summary>
        public ParameterizedObject(ATSceneRef scene) : base(scene)
        {


        }

        [CCLanProperty(cclanPropName = "btmRadius")]
        public double btmRadius { get; set; }
        [CCLanProperty(cclanPropName = "topRadius")]
        public double topRadius { get; set; }

        [CCLanProperty(cclanPropName = "height")]
        public double height { get; set; }

        [CCLanProperty(cclanPropName = "ptCenter")]
        public XPoint3d ptCenter { get; set; }



        /// <summary>
        /// 方法名：SetSolidStyle
        /// 功能：设置实体的显示样式
        /// 
        /// 参数：
        /// - ctx：视图上下文引用
        /// 
        /// 关键类：
        /// - ATViewContxt：视图上下文类，控制显示参数
        /// 
        /// 处理流程：
        /// 1. 设置线条颜色
        /// 2. 更新显示参数
        /// </summary>
        private void SetSolidStyle(ref ATViewContxt ctx)
        {
            ctx.GetCurrentShowParameters().LineColor = 2;
            ctx.CookShowParameters();
        }
        /// <summary>
        /// 方法名：SetFirstLineStyle
        /// 功能：设置第一组辅助线的显示样式
        /// 
        /// 参数：
        /// - ctx：视图上下文引用
        /// 
        /// 关键类：
        /// - ATViewContxt：视图上下文类，控制显示参数
        /// 
        /// 处理流程：
        /// 1. 设置线条颜色为3
        /// 2. 更新显示参数
        /// </summary>
        private void SetFirstLineStyle(ref ATViewContxt ctx)
        {
            ctx.GetCurrentShowParameters().LineColor = 3;
            ctx.CookShowParameters();
        }
        /// <summary>
        /// 方法名：SetSecondLineStyle
        /// 功能：设置第二组辅助线的显示样式
        /// 
        /// 参数：
        /// - ctx：视图上下文引用
        /// 
        /// 关键类：
        /// - ATViewContxt：视图上下文类，控制显示参数
        /// - Session.Entity：会话实体类，获取项目信息
        /// 
        /// 处理流程：
        /// 1. 设置线条颜色为4
        /// 2. 设置线型样式
        /// 3. 设置线宽
        /// 4. 更新显示参数
        /// </summary>
        private void SetSecondLineStyle(ref ATViewContxt ctx)
        {
            ctx.GetCurrentShowParameters().LineColor = 4;
            ctx.GetCurrentShowParameters().SetLineStyle(3,0.1,Session.Entity.GetActiveATProject());
            ctx.GetCurrentShowParameters().Weight = 4;
            ctx.CookShowParameters();
        }

        /// <summary>
        /// 方法名：SetTextStyle
        /// 功能：设置文字标注的显示样式
        /// 
        /// 参数：
        /// - ctx：视图上下文引用
        /// 
        /// 关键类：
        /// - ATViewContxt：视图上下文类，控制显示参数
        /// 
        /// 处理流程：
        /// 1. 设置文字颜色为5
        /// 2. 更新显示参数
        /// </summary>
        private void SetTextStyle(ref ATViewContxt ctx)
        {
            ctx.GetCurrentShowParameters().LineColor = 5;
            ctx.CookShowParameters();
        }

        /// <summary>
        /// 方法名：OnDraw
        /// 功能：实现对象的绘制
        /// 
        /// 参数：
        /// - ctx：视图上下文
        /// 
        /// 返回值：bool，表示绘制是否成功
        /// 
        /// 关键类：
        /// - CircularTable：圆台几何实现类
        /// - SolidCoreEntity：实体核心类
        /// - TextString：文本字符串类
        /// - ATFont：字体管理类
        /// 
        /// 处理流程：
        /// 1. 实体绘制：
        ///    - 创建圆台实体
        ///    - 设置实体样式
        ///    - 绘制实体
        /// 
        /// 2. 辅助线绘制：
        ///    - 设置第一组辅助线样式和位置
        ///    - 设置第二组辅助线样式和位置
        ///    - 绘制辅助线
        /// 
        /// 3. 文字标注：
        ///    - 设置文字样式
        ///    - 配置字体和大小
        ///    - 绘制文字标注
        /// 
        /// 注意事项：
        /// 1. 确保几何创建成功
        /// 2. 正确设置各种样式
        /// 3. 处理坐标转换
        /// 4. 注意文字位置计算
        /// </summary>
        public override bool OnDraw(ATViewContxt ctx)
        {
            CircularTable circularTable = new CircularTable();
            circularTable.btmRadius = btmRadius;
            circularTable.topRadius = topRadius;
            circularTable.ptCenter = ptCenter ;
            circularTable.height = height;
            SolidCoreEntity circularBody = circularTable.GetCircularTable();

            if (circularBody != null)
            {
                SetSolidStyle(ref ctx);
                ctx.GetIViewDraw().DrawBody(circularBody, 0.0);
            }

            SetFirstLineStyle(ref ctx);
            XPoint3d[] linPt=new XPoint3d[2];
            linPt[0] = ptCenter - XVector3d.UnitZ * height * 0.2 - XVector3d.UnitX * btmRadius * 1.2 -
                XVector3d.UnitY * btmRadius * 1.2;
            linPt[1] = ptCenter + XVector3d.UnitZ * height * 1.2 - XVector3d.UnitX * btmRadius * 1.2 -
               XVector3d.UnitY * btmRadius * 1.2;
            ctx.GetIViewDraw().DrawLineString3d(linPt);

            SetSecondLineStyle(ref ctx);
            XPoint3d[] linPt2 = new XPoint3d[2];
            linPt2[0] = ptCenter - XVector3d.UnitZ * height * 0.2 + XVector3d.UnitX * btmRadius * 1.2 +
                XVector3d.UnitY * btmRadius * 1.2;
            linPt2[1] = ptCenter + XVector3d.UnitZ * height * 1.2 + XVector3d.UnitX * btmRadius * 1.2 +
               XVector3d.UnitY * btmRadius * 1.2;
            ctx.GetIViewDraw().DrawLineString3d(linPt2);

            SetTextStyle(ref ctx);
            ATFont font = ATFontManager.GetDecoratorFont();
            XPoint2d fontSize = new XPoint2d(btmRadius, btmRadius);
            TextStringProperties textProp = new TextStringProperties(font, font, fontSize, Session.Entity.GetActiveATScenes());
            textProp.Justification = TextObjectJustification.CenterBaseline;
            XPoint3d textLoaction= ptCenter+ XVector3d.UnitZ * height * 1.2+ XVector3d.UnitX* btmRadius *0.5 +
                XVector3d.UnitY * btmRadius * 0.5;

            TextString textStr = new TextString("示例", textLoaction, XMatrix3d.Identity, textProp);
            ctx.GetIViewDraw().DrawTextString(textStr,false, 0);

            return true;
        }

        /// <summary>
        /// 方法名：OnGetDescription
        /// 功能：获取对象的描述文本
        /// 
        /// 返回值：string，对象的描述文字
        /// 
        /// 关键类：
        /// - ATGraphicObject：基础图形对象类，提供描述功能
        /// 
        /// 使用场景：
        /// 1. 对象列表显示
        /// 2. 提示信息显示
        /// 3. 对象识别
        /// </summary>
        public override string OnGetDescription()
        {
            return "圆台";
        }

        /// <summary>
        /// 方法名：GetOnlyMoveIndex
        /// 功能：设定仅移动类型的夹点索引
        /// 
        /// 返回值：int，移动夹点的索引值
        /// 
        /// 关键类：
        /// - ATGraphicObject：基础图形对象类，提供夹点控制
        /// 
        /// 处理流程：
        /// 1. 返回基准点夹点索引（0）
        /// 
        /// 注意事项：
        /// 1. 此夹点移动时其他夹点同步变化
        /// 2. 通常选择对象的基准点作为移动夹点
        /// </summary>
        public override int GetOnlyMoveIndex()
        {
            return 0;
        }

        /// <summary>
        /// 方法名：CreateControlPoints
        /// 功能：生成对象的控制夹点
        /// 
        /// 返回值：List<XPoint3d>，夹点坐标列表
        /// 
        /// 关键类：
        /// - XPoint3d：三维点类，表示夹点位置
        /// - XVector3d：三维向量类，用于位置计算
        /// 
        /// 处理流程：
        /// 1. 创建底部中心点夹点
        /// 2. 创建顶部中心点夹点
        /// 3. 返回夹点列表
        /// 
        /// 夹点说明：
        /// - pt1：底部中心点，用于整体移动
        /// - pt2：顶部中心点，用于高度调整
        /// 
        /// 注意事项：
        /// 1. 夹点顺序要与GetOnlyMoveIndex对应
        /// 2. 确保夹点位置计算准确
        /// </summary>
        public override List<XPoint3d> CreateControlPoints()
        {
            XPoint3d pt1 = ptCenter;
            XPoint3d pt2 = ptCenter + XVector3d.UnitZ * height;

            List<XPoint3d> ptsArray = new List<XPoint3d>() { pt1, pt2 };
            return ptsArray;
        }

        /// <summary>
        /// 方法名：GetRTUpdateObj
        /// 功能：获取动态预览时使用的图形对象
        /// 
        /// 返回值：List<ATObject>，预览对象列表
        /// 
        /// 关键类：
        /// - CircularTable：圆台几何实现类
        /// - SolidCoreEntity：实体核心类
        /// - GeometryToATObject：几何转换工具类
        /// 
        /// 处理流程：
        /// 1. 创建圆台实体：
        ///    - 设置几何参数
        ///    - 生成实体
        /// 
        /// 2. 转换为图形对象：
        ///    - 将实体转换为ATObject
        ///    - 添加到预览列表
        /// 
        /// 注意事项：
        /// 1. 检查实体创建结果
        /// 2. 确保转换成功
        /// 3. 预览对象可与实际显示不同
        /// </summary>
        public override List<ATObject> GetRTUpdateObj()
        {
            CircularTable circularTable = new CircularTable();
            circularTable.btmRadius = btmRadius;
            circularTable.topRadius = topRadius;
            circularTable.ptCenter = ptCenter;
            circularTable.height = height;
            SolidCoreEntity circularBody = circularTable.GetCircularTable();
            if (circularBody == null)
                return null;
            ATObject obj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), circularBody, null);

            return new List<ATObject>() { obj };
        }

        /// <summary>
        /// 方法名：UpdateByControls
        /// 功能：根据夹点位置更新对象参数
        /// 
        /// 参数：
        /// - modifyControls：修改后的夹点位置列表
        /// - modifyIndex：被修改的夹点索引
        /// 
        /// 关键类：
        /// - XPoint3d：三维点类，表示夹点位置
        /// 
        /// 处理流程：
        /// 1. 验证夹点数量
        /// 2. 更新中心点位置
        /// 3. 计算并更新高度
        /// 
        /// 参数更新规则：
        /// - 中心点：直接使用第一个夹点坐标
        /// - 高度：计算两个夹点的Z向距离
        /// 
        /// 注意事项：
        /// 1. 检查夹点列表有效性
        /// 2. 确保参数计算准确
        /// 3. 注意坐标系统一致性
        /// </summary>
        public override void UpdateByControls(List<XPoint3d> modifyControls, int modifyIndex)
        {
            if (modifyControls.Count < 2)
                return;

            ptCenter = modifyControls[0];
            height = modifyControls[1].Z - modifyControls[0].Z;
        }

    }


}
